package BackEnd;

import java.util.ArrayList;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import Entities.*;

public class AuftragsManager{

	private static AuftragsManager instance = null;
	private ConcurrentHashMap<Integer, YahooFinanceQuoteGetter> planned = null;
	private ConcurrentHashMap<Integer, YahooFinanceQuoteGetter> running = null;
	
	
	public AuftragsManager(){
		planned= new ConcurrentHashMap<Integer, YahooFinanceQuoteGetter>();
		running= new ConcurrentHashMap<Integer, YahooFinanceQuoteGetter>();
		this.initializeAuftragsManager();
	}
	
	/**
	 * 
	 * @return
	 */
	public static synchronized AuftragsManager getInstance(){
		if(instance == null){
			instance = new AuftragsManager();
		}
		return instance;
	}
	
	
	public void startAuftrag(CAuftrag auftrag){
		YahooFinanceQuoteGetter yfqg = new YahooFinanceQuoteGetter(auftrag);
		yfqg.start();
		running.put(auftrag.getAuftragsid(), yfqg);
	}
	
	public void planeAuftrag(CAuftrag auftrag){
		YahooFinanceQuoteGetter yfqg = new YahooFinanceQuoteGetter(auftrag);
		planned.put(auftrag.getAuftragsid(), yfqg);
	}
	
	public void stopAuftrag(CAuftrag auftrag){
		if(!running.isEmpty()){
			running.get(auftrag.getAuftragsid()).interrupt();
			this.runningToFinished(auftrag);
		}
	}
	
	public void interruptAuftrag(CAuftrag auftrag){
		if(!running.isEmpty()){
			if (running.get(auftrag.getAuftragsid())!=null)
				running.get(auftrag.getAuftragsid()).interrupt();
		}
	}
	
	public void stopAuftragManually(CAuftrag auftrag){
		if(!running.isEmpty()){
			running.get(auftrag.getAuftragsid()).interrupt();
			this.runningToFinishedManually(auftrag);
		}
	}
	
	
	public void startPlannedAuftrag(CAuftrag auftrag){
		planned.get(auftrag.getAuftragsid()).start();
		this.plannedToRunning(auftrag);
	}
	
	public ConcurrentHashMap<Integer, YahooFinanceQuoteGetter> getPlanned() {
		return planned;
	}
	public void setPlanned(ConcurrentHashMap<Integer, YahooFinanceQuoteGetter> planned) {
		this.planned = planned;
	}
	public ConcurrentHashMap<Integer, YahooFinanceQuoteGetter> getRunning() {
		return running;
	}
	public void setRunning(ConcurrentHashMap<Integer, YahooFinanceQuoteGetter> running) {
		this.running = running;
	}
	
	public void plannedToRunning(CAuftrag auftrag){	
		running.put(auftrag.getAuftragsid(), planned.get(auftrag.getAuftragsid()));	
		planned.remove(auftrag.getAuftragsid());
		auftrag.setStatus("Aktiv");
		SQLManager.getInstance().refreshStatusDb(auftrag);
	}
	
	public void runningToFinished(CAuftrag auftrag){	
		running.remove(auftrag.getAuftragsid());
		auftrag.setStatus("Beendet");
		SQLManager.getInstance().refreshStatusDb(auftrag);
	}
	
	public void runningToFinishedManually(CAuftrag auftrag){	
		running.remove(auftrag.getAuftragsid());
		auftrag.setStatus("Abgebrochen");
		SQLManager.getInstance().refreshStatusDb(auftrag);
	}
	
	public void pauseAllRunningThreads(){
		for (Map.Entry<Integer, YahooFinanceQuoteGetter> entry : running.entrySet()){
			if(!entry.getValue().isInterrupted()){
				entry.getValue().interrupt();
			}
		}
		running.clear();
	}
	
	public void resumeAllRunningThreads(){
		if(running.isEmpty()){
			this.fillHashMapForInitialization(SQLManager.getInstance().getAlleAuftraegeFromDBWithSpecificStatus("Aktiv"), running);			
		}
	}
	
	public void initializeAuftragsManager(){
		this.fillHashMapForInitialization(SQLManager.getInstance().getAlleAuftraegeFromDBWithSpecificStatus("Aktiv"), running);
		this.fillHashMapForInitialization(SQLManager.getInstance().getAlleAuftraegeFromDBWithSpecificStatus("Geplant"), planned);
	}
	
	public void fillHashMapForInitialization(ArrayList<CAuftrag> list, ConcurrentHashMap<Integer, YahooFinanceQuoteGetter> hashmap){
		YahooFinanceQuoteGetter getter;
		for (int i=0;i<list.size();i++){
			getter = new YahooFinanceQuoteGetter(list.get(i));
			hashmap.put(list.get(i).getAuftragsid(), getter);
			if (TimeManager.getInstance().isActualTimeOutsideBoersenZeit() == false)
				getter.start();
		}
	}
	
	public YahooFinanceQuoteGetter getQuote(int key){
		return running.get(key);
	}
	
	
}
